/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：mindfa.h
 * 模块功能说明：
 * 该模块定义最小化DFA结构体，定义生成最小化DFA过程的各种函数，并构建最小化DFA状态转移表，完成了minDFA图的生成工作。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#ifndef MINDFA_H
#define MINDFA_H


#include "utils.h"
#include "presolve.h"
#include "NFA_maker.h"
#include "DFA_maker.h"

struct MinDFANode {
    int id;                         // 状态ID
    int cd = 0;                     // 顺序单词编码(只有终态可能有)
    int endcd=0;                    //最终单词编码，针对老师的编码要求需要进行的重新编码
    QString flag = " ";             // 状态标记："i"(初态), "o"(终态), "io"(初态+终态)
    QMap<QChar, int> transfer;      // 转移函数
    QSet<int> originalStates;       // 包含的原始DFA状态ID集合

    MinDFANode(int id, QString flag = " ") : id(id), flag(flag) {}

    // 添加原始状态
    void addOriginalState(int stateId, const QVector<DFANode*>& nodes) {
        originalStates.insert(stateId);
        // 继承属性
        DFANode* node = nodes[stateId];
        if (node->flag.contains("i")) flag = flag.contains("o") ? "io" : "i";
        if (node->flag.contains("o")) {
            flag = flag.contains("i") ? "io" : "o";
            cd = node->cd;  // 继承终态的单词编码
        }
    }

    bool operator==(const MinDFANode& other) const {
        return originalStates == other.originalStates;
    }
};

//存储最小化DFA图
extern QVector<MinDFANode*>minDFA;

//最小化dfa的初态id
extern int MDFAstart;


#endif // MINDFA_H
